#ifndef GUARD_MATRICE_H
#define GUARD_MATRICE_H

#include "Vecteur.h"
#include "Point.h"
#include <math.h>
#include <ostream>
#define NB_LIGNES 4
/*
std::ostream& operator<<( std::ostream &flux, Point const& p )
{
    p.afficher(flux);
    return flux;
}
*/

class Matrice{

    private :
    Point tab[4];

    public :
    Matrice ();
	
    Matrice (Vecteur liste[NB_LIGNES]);
    Matrice (Vecteur v1, Vecteur v2, Vecteur v3, Point p);

    int getLignes();
    int getColonnes();

    Point & operator[] (unsigned i);

    Point* getTab();

    ~Matrice();

    Matrice multiplie(Matrice &m);
    Vecteur multiplie (const Vecteur& v);
	Point multiplie (const Point& v);
	Matrice operator*(Matrice& m); 
	Point operator*(const Point& p); 
	Vecteur operator*(const Vecteur& v); 
    static Vecteur translate(Vecteur original, Vecteur translation);
	static Matrice matriceTranslate(Vecteur translation);
    static Vecteur rotation(Vecteur original, Point axe, float angle);
    static Matrice matriceRotation(Vecteur const &axe, float angle);
	static Matrice matriceRotation_x(float angle);
	static Matrice matriceRotation_y(float angle);
	static Matrice matriceRotation_z(float angle);
	static Matrice matriceHomotethie(Vecteur homotethie);
	
	Matrice transpose();

    static Vecteur changementRepere(Matrice repere, Point translation, Vecteur original);

	Matrice matriceInverse();

	virtual void afficher(std::ostream &flux) const;

	Matrice matriceRepere(Vecteur vecteurZ, Point &p);
	Matrice matriceRepere(Vecteur vecteurZ, Vecteur vecteurX, Point &pos);
};


#endif
